<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 15-3-1
 * Time: 上午11:34
 */

namespace Common\Model;


use Common\Org\Page\AjaxPage;
use Think\Model;

/**
 * 抽象公共数据模型
 * Class CommonModel
 * @package Common\Model
 */
abstract class CommonModel extends Model {

    protected function setAlias($alias){
        return $this->table(C('DB_PREFIX').$this->tableName.' as '.$alias);
    }

    /**
     * 判断某字段的值是否已存在
     * @param $field 要判断的字段名
     * @param $value 要判断的字段值
     * @param $pkVal 主键的值，默认为空
     * @return bool 若已存在返回true，否则返回false
     */
    public function checkFieldExists($field,$value,$pkVal=null){
        //TODO
        $map = array();
        $map[$field] = $value;
        !empty($pkVal) && $map[$this->pk] = array('neq',$pkVal);

        $res = $this->where($map)->cache(5)->getField($this->pk);

        if($res){
            return true;
        } else {
            return false;
        }
    }

    /**
     * 简单的添加或更新操作
     * @param $data 要添加或更新的数据
     * @param null $id 编号ID，为空则表示添加，否则为更新
     * @return null 成功返回编号ID，否则返回false
     */
    public function update($data,$id=null){
        //TODO
        if(empty($data)) return false;

        if(empty($id) && !empty($data[$this->pk])){
            $id = $data[$this->pk];
        }

        if(empty($id)){
            $res = $id = $this->add($data);

        } else {
            $res = $this->where(array($this->pk=>$id))->save($data);
        }

        if($res>=0){
            return $id;
        } else {
            return false;
        }
    }

    /**
     * 简单的禁用或启用
     * @param $id 编号ID
     * @param $status 更新之后的状态值
     * @param $field 字段名，默认为status
     * @return bool 成功返回true，否则返回false
     */
    public function setStatus($id,$status,$field='status'){
        //TODO
        if(empty($id)) return false;

        $res = $this->where(array($this->pk=>$id))->setField($field,$status);

        if($res){
            return true;
        } else {
            return false;
        }
    }

    /**
     * 排序
     * @param $id
     * @param $sort
     * @return bool
     */
    public function sort($id,$sort){
        return $this->setStatus($id,$sort,'sort');
    }

    /**
     * 简单的删除
     * @param $id 编号ID
     * @return bool 成功返回true，否则返回false
     */
    public function del($id){
        //TODO
        if(empty($id)) return false;

        $map = array();
        if(is_array($id) || (is_string($id) && strpos($id,',')!==false)){
            $map[$this->pk] = array('in',$id);
        } else {
            $map[$this->pk] = $id;
        }

        $res = $this->where($map)->delete();

        if($res>=0){
            return true;
        } else {
            return false;
        }
        return true;
    }

    /**
     * 获取详情
     * @param $id 编号ID
     * @param bool $field 查询字段，默认为查询所有
     * @return mixed
     */
    public function detail($id,$field=true){
        return $this->where(array($this->pk=>$id))->field($field)->find();
    }

    /**
     * 简单的分页查询获取列表数据
     * @param $limit 要获取的记录数，默认为20
     * @param string $order 排序，默认按自增倒序排序
     * @param array $map 查询条件，默认为空
     * @param array $field 查询字段，默认为查询所有
     * @return mixed
     */
    public function getList($map=array(),$order='',$limit=20,$field=true){

        empty($order) && $order = $this->pk.' desc';

        return $this->field($field)->where($map)->order($order)->cache(5)->findPage($limit);
    }

    /**
     * 简单查询多条记录
     * @param array $map
     * @param string $order
     * @param bool $field
     * @param bool $limit
     */
    public function getAll($map=array(),$order='',$field=true,$limit=false){
        empty($order) && $order = $this->pk.' desc';

        return $this->field($field)->where($map)->order($order)->limit($limit)->cache(5)->select();
    }

    /**
     * 分页查询数据
     * @access public
     * @param mixed $options 表达式参数
     * @param mixed $pageopt 分页参数
     * @param mixed $is_turn 是否可以选择跳转到第几天， 1=无， 2=有
     * @param mixed $prefix 输出变量前缀
     * @return mixed
     */
    public function findPage($pageopt,$count=false,$options=array(),$is_turn=1,$prefix = '') {
        // 分析表达式
        $options =  $this->_parseOptions($options);
        // 如果没有传入总数，则自动根据条件进行统计
        if($count===false){
            // 查询总数
            $count_options      =   $options;
            $count_options['limit'] = 1;
            $count_options['field'] = 'count(1) as count';
            // 去掉统计时的排序提高效率
            unset($count_options['order']);
            $result =   $this->db->select($count_options);
            $count  =   $result[0]['count'];
            unset($result);
            unset($count_options);
        }


        // 如果查询总数大于0
        if($count > 0) {
            // 解析分页参数
            if( is_numeric($pageopt) ) {
                $pagesize   =   intval($pageopt);
            }else{
                $pagesize   =   10;
            }

            $p  =   new AjaxPage($count,$pagesize,'',$is_turn);

            //定制分页样式
            $p->setConfig('first','1');
            $p->setConfig('last','%TOTAL_PAGE%');
            $p->setConfig('prev','上一页');
            $p->setConfig('next','下一页');
            $p->setConfig('theme','%UP_PAGE% <span class="arial">%FIRST% %LINK_PAGE% %END%</span> %DOWN_PAGE%');
            $p->setConfig('first_class','');
            $p->setConfig('end_class','ellipsis');
            $p->setConfig('normal_class','');
            $p->setConfig('current_class','current');
            $p->setConfig('first_after_html','<a href="javascript:;">...</a>');
            $p->setConfig('end_before_html','<a href="javascript:;">...</a>');

            $p->setRollPage(5);

            // 查询数据
            $options['limit']   =   $p->firstRow.','.$p->listRows;
            $resultSet  =   $this->select($options);

            if($resultSet){
                $this->dataList = $resultSet;
            }else{
                $resultSet  =   '';
            }

            // 输出控制
            $output[$prefix.'count']        =   $count;
            $output[$prefix.'totalPages']   =   $p->totalPages;
            $output[$prefix.'totalRows']    =   $p->totalRows;
            $output[$prefix.'nowPage']      =   $p->nowPage;
            $output[$prefix.'page']         =   $p->show();
            $output[$prefix.'data']         =   $resultSet;
            unset($resultSet);
            unset($p);
            unset($count);
        }else{
            $output[$prefix.'count']        =   0;
            $output[$prefix.'totalPages']   =   0;
            $output[$prefix.'totalRows']    =   0;
            $output[$prefix.'nowPage']      =   1;
            $output[$prefix.'page']         =   '';
            $output[$prefix.'data']         =   '';
        }
        // 输出数据
        return $output;
    }

    /**
     * 判断是否有子类
     * @param $id
     * @return bool
     */
    public function hasSon($id){
        if(empty($id)) return 0;

        $map = array();
        $map['pid'] = $id;

        return $this->where($map)->count();
    }

    public function setArticleRecommend($id,$is_recommend){
        if(empty($id)) return false;

        $map = array();
        $map[$this->pk] = $id;

        return $this->where($map)->setField('is_recommend',$is_recommend);
    }
} 